# -*-coding:utf-8-*-
import pandas as pd

date_str = pd.Series(['2021-1-1', '2021-01-01', '01/01/2021', '2021.01.01', '20210101'])
df_combin = pd.DataFrame({'year': [2020, 2021, 2022],
                          'month': [1, 2, 3],
                          'day': [12, 13, 14]})
"""1.数据转换成datetime64
pd.to_datetime(arg, errors="raise", dayfirst=False, yearfirst=False, utc=None, format=None, exact=True, 
               unit=None, infer_datetime_format=False, origin="unix", cache=True)
    将时间字符串转换成datetime64，或者将一组数据组合成datetime64
    -arg：要转换为日期时间的对象
    -errors：'raise'：则无效解析将引发异常。'coerce'：则无效解析将被设置为NaT。'ignore'：则无效解析将返回输入
    -dayfirst：如果arg参数是str或列表，则指定日期解析顺序。True：首先解析日期，例如10/11/12被解析为2012-11-10
    -yearfirst：如果arg参数是str或列表，则指定日期解析顺序。True：将日期首先解析为年份，例如10/11/12被解析为2010-11-12。
                如果dayfirst和yearfirst都为True，则yearfirst优先
    -utc：如果为True，则返回UTC DatetimeIndex
    -format：解析时间的strftime，例如“%d/%m/%Y”，注意“%f”将一直解析到纳秒
    -exact：True：则需要精确的格式匹配。False：则允许格式匹配目标字符串中的任何位置
    -unit：参数(D,s,ms,us,ns) 的单位表示时间单位。例如，使用unit='ms'和origin='unix'（默认值），这将计算到unix纪元开始的毫秒数
    -origin：定义参考日期。自此参考日期以来，数值将被解析为单位数（由“单位”定义）
    -cache：如果为True，则使用唯一的已转换日期缓存来应用日期时间转换
"""
date = pd.to_datetime(date_str)  # 将时间字符串转换成datetime64
date2 = pd.to_datetime(df_combin)  # 将一组数据组合成datetime64

"""2.获取日期型Series的日期属性
Series.dt：获取日期属性的一个访问器对象，通过它可以获取年、月、日等信息
dt.year/month/day/hour/minute/second - 年/月/日/小时/分/秒
dt.week (dt.weekofyear和dt.week一样) - 一年中的第几周
dt.day_name() - 星期几的英文
dt.dayofyear - 一年的第几天
dt.quarter - 每个日期分别是第几个季度
dt.is_month_start和dt.is_month_end - 日期是否是每月的第一天或最后一天，可以将month换成year和quarter
dt.is_leap_year - 是否是闰年
dt.month_name() - 月份的英文名称.
"""
s_weekname = date2.dt.day_name()

"""3.获取单个日期数据的属性
datetime64类型Series中单个数据的类型为Timestamp
"""
a: pd.Timestamp = date[0]
year = a.year

"""4.生成日期序列索引
主要提供pd.data_range()和pd.period_range()两个方法，给定参数有起始时间、结束时间、生成时期的数目及时间频率等。
两种主要区别在于pd.date_range()生成的是DatetimeIndex格式的日期序列;pd.period_range()生成的是PeriodIndex格式的日期序列

date_range(start, end, periods, freq, tz, normalize, name, closed) -> DatetimeIndex
    -start：生成日期的左边界。
    -end：生成日期的右边界。
    -period：要生成的日期个数。
    -freq – 时间频率，例如'5H'表示5小时  

| freq      | 描述
| --------- | --------------------------------------------- 
| Y         | 年
| M         | 月
| D         | 日 (默认) 
| T         | 分钟
| S         | 秒 
| L         | 毫秒 
| U         | 微秒
| A-DEC     | 每年指定月份的最后一个日历日 
| W-MON     | 指定每月的哪个星期开始
| WOM_2MON  | 指定每个月的第几个星期 (这里是第二个星期)
| Q-DEC     | 指定月为季度末，每个季度末最后一月的最后一个日历日
| B(M/Q/A)S | 分别代表了工作日（以月/季度/年为频率）最接近月初的那一天
| B         | 工作日
"""
pd.date_range('2021.1.1', periods=5, freq='2D')  # 生成间隔为2天、数量为5个的日期序列索引
df_combin.resample()
